.. role:: raw-html-m2r(raw) :format: html .. _Vec: Vec === Description ^^^^^^^^^^^ A ``Vec`` is a composite type that defines a group of indexed signals (of any SpinalHDL basic type) under a single name. Declaration ^^^^^^^^^^^ The syntax to declare a vector is as follows: .. list-table:: :header-rows: 1 :widths: 1 2 * - Declaration - Description * - Vec(type: Data, size: Int) - Create a vector capable of holding ``size`` elements of type ``Data`` * - Vec(x, y, ...) - | Create a vector where indexes point to the provided elements. | This constructor supports mixed element width. Examples ~~~~~~~~ .. code-block:: scala // Create a vector of 2 signed integers val myVecOfSInt = Vec(SInt(8 bits), 2) myVecOfSInt(0) := 2 myVecOfSInt(1) := myVecOfSInt(0) + 3 // Create a vector of 3 different type elements val myVecOfMixedUInt = Vec(UInt(3 bits), UInt(5 bits), UInt(8 bits)) val x, y, z = UInt(8 bits) val myVecOf_xyz_ref = Vec(x, y, z) // Iterate on a vector for(element <- myVecOf_xyz_ref) { element := 0 // Assign x, y, z with the value 0 } // Map on vector myVecOfMixedUInt.map(_ := 0) // Assign all elements with value 0 // Assign 3 to the first element of the vector myVecOf_xyz_ref(1) := 3 Operators ^^^^^^^^^ The following operators are available for the ``Vec`` type: Comparison ~~~~~~~~~~ .. list-table:: :header-rows: 1 * - Operator - Description - Return type * - x === y - Equality - Bool * - x =/= y - Inequality - Bool .. code-block:: scala // Create a vector of 2 signed integers val vec2 = Vec(SInt(8 bits), 2) val vec1 = Vec(SInt(8 bits), 2) myBool := vec2 === vec1 // Compare all elements Type cast ~~~~~~~~~ .. list-table:: :header-rows: 1 * - Operator - Description - Return * - x.asBits - Binary cast to Bits - Bits(w(x) bits) .. code-block:: scala // Create a vector of 2 signed integers val vec1 = Vec(SInt(8 bits), 2) myBits_16bits := vec1.asBits Misc ~~~~ .. list-table:: :header-rows: 1 :widths: 2 5 1 * - Operator - Description - Return * - x.getBitsWidth - Return the full size of the Vec - Int .. code-block:: scala // Create a vector of 2 signed integers val vec1 = Vec(SInt(8 bits), 2) println(vec1.getBitsWidth) // 16 Lib helper functions ~~~~~~~~~~~~~~~~~~~~ .. note:: You need to import ``import spinal.lib._`` to put these functions in scope. .. list-table:: :header-rows: 1 :widths: 3 4 1 * - Operator - Description - Return * - x.sCount(condition: T => Bool) - Count the number of occurence matching a given condition in the Vec. - UInt * - x.sCount(value: T) - Count the number of occurence of a value in the Vec. - UInt * - x.sExists(condition: T => Bool) - Check if there is a matching condition in the Vec. - Bool * - x.sContains(value: T) - Check if there is an element with a given value present in the Vec. - Bool * - x.sFindFirst(condition: T => Bool) - Find the first element matching the given condition in the Vec, return the index of that element. - UInt * - x.reduceBalancedTree(op: (T, T) => T) - Balanced reduce function, to try to minimize the depth of the resulting circuit. ``op`` should be commutative and associative. - T * - x.shuffle(indexMapping: Int => Int) - Shuffle the Vec using a function that maps the old indexes to new ones. - Vec[T] .. code-block:: scala import spinal.lib._ // Create a vector with 4 unsigned integers val vec1 = Vec(UInt(8 bits), 4) // ... the vector is actually assigned somewhere val c1: UInt = vec1.sCount(_ < 128) // how many values are lower than 128 in vec val c2: UInt = vec1.sCount(0) // how many values are equal to zero in vec val b1: Bool = vec1.sExists(_ > 250) // is there a element bigger than 250 val b2: Bool = vec1.sContains(0) // is there a zero in vec val u1: UInt = vec1.sFindFirst(_ < 10) // get the index of the first element lower than 10 val u2: UInt = vec1.reduceBalancedTree(_ + _) // sum all elements together .. note:: The sXXX prefix is used to disambiguate with respect to identically named Scala functions that accept a lambda function as argument.